package c.x.jy.common.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import love.cq.util.StringUtil;

/**
 * 日期工具类
 */
@SuppressWarnings("all")
public class DateUtil {
    public static final String PATTERN_DATE = "yyyy-MM-dd";
    public static final String PATTERN_MONTH = "yyyy-MM";
    public static final String PATTERN_SECONDS = "yyyy-MM-dd HH:mm:ss";
    public static final String PATTERN_CHINA_DATE = "yyyy年MM月dd日";
    // 设置时间格式
    public final  static SimpleDateFormat dateFomat = new SimpleDateFormat("yyyy-MM-dd");
    
    public final  static    SimpleDateFormat dateTimeFomat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
 

    /**
     * 字符串转日期
     * @param dateStr 字符串格式的日期
     * */
    public static Date toDate(String dateStr){
        if(StringUtil.isBlank (dateStr)){ return null; }
        try {
            return new SimpleDateFormat(PATTERN_DATE).parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 字符串转日期
     * @param dateStr 字符串格式的日期
     * @param pattern 格式
     * */
    public static Date toDate(String dateStr, String pattern){
        if(StringUtil.isBlank (dateStr)){ return null; }
        if(StringUtil.isBlank (pattern)){ pattern = PATTERN_DATE; }
        try {
            return new SimpleDateFormat(pattern).parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 日期转字符串
     * @param date 日期
     * */
    public static String parse(Date date){
        if(date == null){ return ""; }
        return new SimpleDateFormat(PATTERN_DATE).format(date);
    }

    /**
     * 日期转字符串
     * @param date 日期
     * @param pattern 格式
     * */
    public static String parse(Date date, String pattern){
        if(date == null){ return ""; }
        if(StringUtil.isBlank (pattern)){ pattern = PATTERN_DATE; }
        return new SimpleDateFormat(pattern).format(date);
    }

    /**
     * 日期转字符串,前后带单引号
     * @param date 日期
     * */
    public static String parseDateParam(Date date){
        if(date == null){ return "''"; }
        return "'" + new SimpleDateFormat(PATTERN_DATE).format(date) + "'";
    }

    /**
     * 获取当天0时0分0秒0毫秒
     * */
    public static Calendar getSysCalendar(){
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY,0);
        calendar.set(Calendar.MINUTE,0);
        calendar.set(Calendar.SECOND,0);
        calendar.set(Calendar.MILLISECOND,0);
        return calendar;
    }

    /**
     * 截取到0时0分0秒
     * */
    public static Date trunc(Date date){
        if(date == null){ return null; }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY,0);
        calendar.set(Calendar.MINUTE,0);
        calendar.set(Calendar.SECOND,0);
        calendar.set(Calendar.MILLISECOND,0);
        return calendar.getTime();
    }

    /**
     * 截取到秒
     * */
    public static Date truncSecond(Date date){
        if(date == null){ return null; }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.MILLISECOND,0);
        return calendar.getTime();
    }

    /**
     * 判断是否今天
     * @param date 日期
     * */
    public static boolean isToday(Date date){
        if(date == null) return false;
        date = trunc(date);
        return date.getTime() == getSysCalendar().getTime().getTime();
    }

    /**
     * 比较两个日期的大小,精确到天
     * @param dateOne 日期
     * @param dateTwo 日期
     * @return int -1:dateOne < dateTwo; 0:dateOne = dateTwo; 1:dateOne > dateTwo
     */
    public static int compareDate(Date dateOne, Date dateTwo){
        return trunc(dateOne).compareTo(trunc(dateTwo));
    }
    
    
    // 获取本周开始时间
    public static Date startWeek(Date date) {
    	date=date==null?(new Date()):date;
        // 使用Calendar类进行时间的计算
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 获得当前日期是一个星期的第几天
        // 判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会计算到下一周去。
        // dayWeek值（1、2、3...）对应周日，周一，周二...
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
        if (dayWeek == 1) {
            dayWeek = 7;
        } else {
            dayWeek -= 1;
        }
        System.out.println("前时间是本周的第几天:" + dayWeek); // 输出要当前时间是本周的第几天
        // 计算本周开始的时间
        cal.add(Calendar.DAY_OF_MONTH, 1 - dayWeek);
        Date startDate = cal.getTime();
        System.out.println("本周开始时间（周一）：" + dateFomat.format(startDate) + "==当前时间：" + dateFomat.format(date));
        return startDate;
    }

    
 // 获取本月的开始时间
    public static Date startMonth(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 设置为1号,当前日期既为本月第一天
        cal.set(Calendar.DAY_OF_MONTH, 1);
        Date startDate = cal.getTime();
        System.out.println("本月开始时间（1号）：" + dateFomat.format(startDate) + "==当前时间：" + dateFomat.format(date));
		return startDate;
    }

    // 获取本年的开始时间
    public static Date startYear(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 设置月和日都为1，即为开始时间（注：月份是从0开始;日中0表示上个月最后一天，1表示本月开始第一天）
        cal.set(Calendar.MONTH, 0);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        Date startDate = cal.getTime();
        System.out.println("今年开始时间（1月1号）：" + dateFomat.format(startDate) + "==当前时间：" + dateFomat.format(date));
		return startDate;
    }
 
    
    /**
     *  java 获取 获取某年某月 所有日期（yyyy-mm-dd格式字符串）
     * @param year
     * @param month
     * @return
     */
    public static List<String> getMonthFullDay(int year , int month){
      //  SimpleDateFormat dateFormatYYYYMMDD = new SimpleDateFormat("yyyy-MM-dd");
        List<String> fullDayList = new ArrayList<>(32);
        // 获得当前日期对象
        Calendar cal = Calendar.getInstance();
        cal.clear();// 清除信息
        cal.set(Calendar.YEAR, year);
        // 1月从0开始
        cal.set(Calendar.MONTH, month-1 );
        // 当月1号
        cal.set(Calendar.DAY_OF_MONTH,1);
        int count = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        for (int j = 1; j <= count ; j++) {
            fullDayList.add(dateFomat.format(cal.getTime()));
            cal.add(Calendar.DAY_OF_MONTH,1);
        }
        return fullDayList;
    }
    
    /**周日 1 周一 2  ....
     * 今天是这周的第几天
     * @param date
     * @return
     */
    public static int getWeekDay(Date date){
    	   // 使用Calendar类进行时间的计算
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 获得当前日期是一个星期的第几天
        // 判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会计算到下一周去。
        // dayWeek值（1、2、3...）对应周日，周一，周二...
       
		return  cal.get(Calendar.DAY_OF_WEEK);
    	
    }
    /**
     *  java 获取本周 所有日期（yyyy-mm-dd格式字符串）
     * @param year
     * @param month
     * @return
     */
    public static List<String> getFullDay(Date date){
    	
    	   // 使用Calendar类进行时间的计算
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 获得当前日期是一个星期的第几天
        // 判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会计算到下一周去。
        // dayWeek值（1、2、3...）对应周日，周一，周二...
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);

        // 计算本周开始的时间
        cal.add(Calendar.DAY_OF_MONTH,  dayWeek);

        SimpleDateFormat dateFormatYYYYMMDD = new SimpleDateFormat("yyyy-MM-dd");
        List<String> fullDayList = new ArrayList<>( );
        for (int j = 1; j <= 7 ; j++) {
            fullDayList.add(dateFormatYYYYMMDD.format(cal.getTime()));
            cal.add(Calendar.DAY_OF_MONTH,1);
        }
        return fullDayList;
    }
    
    /**
     * 给时间加上几个小时
     * @param day 当前时间 格式：yyyy-MM-dd HH:mm:ss
     * @param hour 需要加的时间
     * @return
     */
    public static String addDateMinut(String day, int hour){   
   
        Date date = null;   
        try {   
            date = dateTimeFomat.parse(day);   
        } catch (Exception ex) {   
            ex.printStackTrace();   
        }   
     
        return dateTimeFomat.format(addDateMinut(date, hour));   
 
    }

    /**
     * 时间增加小时
     * @param date
     * @param hour  小时数
     * @return
     */
    public static Date addDateMinut(Date date, int hour){   
     
        if (date == null)   
            return null;   
       // System.out.println("front:" + format.format(date)); //显示输入的日期  
        Calendar cal = Calendar.getInstance();   
        cal.setTime(date);   
        cal.add(Calendar.HOUR, hour);// 24小时制   
        date = cal.getTime();   
        //System.out.println("after:" + format.format(date));  //显示更新后的日期 
        cal = null;   
        return  date ;   
 
    }
    
    /**
     * 给时间加上几分钟
     * @param day 当前时间 格式：yyyy-MM-dd HH:mm:ss
     * @param hour 需要加的时间
     * @return
     */
    public static Date addDateMM( Date date, int minute){   
      
        if (date == null)   
            return null;   
       // System.out.println("front:" + format.format(date)); //显示输入的日期  
        Calendar cal = Calendar.getInstance();   
        cal.setTime(date);   
        cal.add(Calendar.MINUTE, minute);   
        date = cal.getTime();   
        //System.out.println("after:" + format.format(date));  //显示更新后的日期 
        cal = null;   
        return date;   
 
    }
    
    public static void main(String[] args) {
   // 	Date d=new Date("2019/05/13 00:00:00 ");
		//System.out.println(startMonth(new Date()));
		//  Calendar cal = Calendar.getInstance();
		//System.out.println(cal.get(Calendar.MONTH));
		//System.out.println(getMonthFullDay(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH)+1));
	//	System.out.println(getFullDay(d));
		//System.out.println(addDateMM(d,50));
    	Date d=new Date("1970/01/01 00:00:00");
    	System.out.println(dateTimeFomat.format( addDateMinut(d, 7*24)));
    	SimpleDateFormat format = new SimpleDateFormat("HH:mm");
		Date nowtime = null;
		try {
		//	nowtime = format.parse(format.format(new Date()));
			nowtime =	format.parse("16:00:00");
			new Date(28800000);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	System.out.println(nowtime.getTime());
	}

    
    /**
     * 格式化日期   yyyy-MM-dd
     * @param date
     * @return
     */
    public static String forMatDate(Date date){
		return dateFomat.format(date);
    	
    }
    /**
     * 获取当周的周一
     * @return
     */
	public static Date startWeek() {
 
		return startWeek(null);
	} 

}
